#ifndef JEU_H
#define JEU_H
#include "brique.h"
#include "terrain.h"
#include "barre.h"
#include "balle.h"
#include "tableau.h"


struct Sjeu
{
	Terrain* t;
	Balle* bl;
	Barre* br;
	int vie;
	int valeurFin;
};
typedef struct Sjeu Jeu;

/**
 * @brief initJeu intialise le jeu
 * @param j est un pointeur sur jeu
 */
void initJeu(Jeu* j, const int map[HAUTEUR][LARGEUR]);

/**
 * @brief creerJeu alloue un espace pour le jeu et renvoie un pointeur sur ce jeu
 * @param map est la dimension du terrain
 */
Jeu* creerJeu(const int map[HAUTEUR][LARGEUR]);

/**
 * @brief getTerrainJeu renvoi un pointeur sur terrain
 * @param j est un pointeur sur jeu
 */
Terrain* getTerrainJeu(Jeu* j);

/**
 * @brief getBalleJeu renvoi un pointeur sur balle
 * @param j est un pointeur sur jeu
 */
Balle* getBalleJeu(Jeu* j);

/**
 * @brief getBarreJeu renvoi un pointeur sur barre
 * @param j est un pointeur sur jeu
 */
Barre* getBarreJeu(Jeu* j);

/**
 * @brief getVieJeu renvoi le nombre de vie restant
 * @param j est un pointeur sur jeu
 */
int getVieJeu(Jeu* j);

/**
 * @brief jeuSetVie modifie la valeur du champ vie dans la structure jeu
 * @param j est un pointeur sur jeu
 */
void setVieJeu(Jeu* j);

int getFinJeu(Jeu* j);

void setFinJeu(Jeu* j, int n);

/**
 * @brief getConstTerrainJeu renvoi un pointeur constant sur terrain
 * @param j est un pointeur constant sur jeu
 */
const Terrain* getConstTerrainJeu(const Jeu* j);

/**
 * @brief getConstBalleJeu renvoi un pointeur constant sur balle
 * @param j est un pointeur constant sur jeu
 */
const Balle* getConstBalleJeu(const Jeu* j);

/**
 * @brief getConstBarreJeu renvoi un pointeur constant sur barre
 * @param j est un pointeur constant sur jeu
 */
const Barre* getConstBarreJeu(const Jeu* j);

/**
 * @brief getConstVieJeu renvoi une valeur constante de vie
 * @param j est un pointeur constant sur jeu
 */
const int getConstVieJeu(const Jeu* j);

/**
 * @brief actionClavierJeu deplace la barre en fonction des touches clavier
 * @param j est un pointeur sur jeu et touche est un caractere constant
 */
void actionClavierJeu(Jeu* j, const char touche);
void actionSourisJeu(Jeu* j, int xs);


/**
 * @brief calculerNouvelleDirectionBal modifie les valeurs des champs dirX et dirY en fonction de sa prochaine position et de sa direction
 * @param j est un pointeur sur un jeu
 */
void calculerNouvelleDirectionJeu(Jeu* j);

void libereJeu(Jeu* j);


void rattrapeOptionJeu(Jeu* j);




#endif
